/*
 * Copyright (c) 2024 endless-sky
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include "restful.h"
#include <memory>
#include <string>
#include "web_server.h"
#include "protocol.h"

namespace El {
namespace Restful {

class RestfulServiceImpl : public IRestfulService {
public:
    /**
     * @brief 获取 RestfulService 单例实例
     * @return RestfulService 单例实例的引用
     */
    static RestfulServiceImpl &GetInstance();

    /**
     * @brief 初始化 RESTful API 服务
     * @return 初始化是否成功
     */
    bool Start() override;

    /**
     * @brief 停止 RESTful API 服务
     */
    void Stop() override;

private:
    RestfulServiceImpl() = default;
    ~RestfulServiceImpl() = default;
    RestfulServiceImpl(const RestfulServiceImpl &) = delete;
    RestfulServiceImpl &operator=(const RestfulServiceImpl &) = delete;

    void RegisterApiHandlers();

    WebServer::HttpResponse ProcessHandlers(const WebServer::HttpRequest &req);

private:
    bool isRunning_{false};
    std::shared_ptr<Protocol::IProtocol> protocol_;
};
} // namespace Restful
} // namespace El
